package kuonjisai;

public class J17_OOP3 {

	// 생성자
	
	// this 연산자, this 생성자
	// 멤버변수에 사용하는 this는 현재 클래스 자신을 의미함
	// 생성자에 사용하는 this 는 코드 간결성을 위해 사용 
	
	
	public static void main(String[] args) {
		// 생성자를 이용해 객체를 만들고
		// 멤버변수에 값을 직접 초기화
		Member user01 = new Member();
		user01.userid = "우끼끼몽키";
		user01.passwd = "바나나주세여";
		
		// 기본생성자만을 이용해서
		// 멤버변수 초기화
		Member user02 = new Member( );
		user02.showInfo();
		Member user03 = new Member( );
		user03.showInfo();
		
		// 인자있는 생성자로 객체 생성
		Member user04 = new Member( "스타 플라티나!", "오라오라오라오라오라!" );
		user04.showInfo();
		
		Car mycar01 = new Car();
		
		
		
	} // main

} // class

	class Member {
		String userid;
		String passwd;
		
		// 기본 생성자 - 인자없음
		public Member() {
			userid = "외계인";
			passwd = "아, 싸만코";
		}
		
		// 사용자 정의 생성자 - 인자 있음
		public Member( String myuserid, String mypasswd ){
			userid = myuserid;			
			passwd = mypasswd;			
		}
		
		// 회원정보 출력 showInfo
		void showInfo(){
			System.out.println( userid );
			System.out.println( passwd );
		} // mt_showInfo
			
	} // Member
	
	class Car {
		String brand;
		String color;
		
		// 기본 생성자
		public Car() {
			
		} // pb_bsCar
		
		// 인자 있는 생성자를 사용하는 경우
		// 기본생성자도 직접 만들어 둬야 함
		public Car( String mybrand, String mycolor){
			brand = mybrand;
			color = mycolor;
			
		} // pb_Car
		
	} // Car
	
	class DVD {
		int dvdno;
		String dvdtitle;
		String genre;
		
		public DVD() {	 }
		
		// DVD 생성자 - 고유번호, 타이틀, 장르 
		public DVD( int dvdno, String dvdtitle, String genre ) {	 
			// 생성자의 인자명과 메머변수명은 동일하게 작성
			// 왜냐하면, 생성자의 인자명을 새로 짓는것은 귀찮음
			
			// 그런데, 생성자의 인자명과 멤버 변수명이 서로 같은경우
			// 멤버변수가리기shadowing 현상이 발생
			// 따라서, 클래스의 멤버변수는 this 연산자를
			// 이용해서 가리기 현상을 방지
			/*dvdno = dvdno;
			dvdtitle = dvdtitle;
			genre = genre;
			*/
			this.dvdno = dvdno;
			this.dvdtitle = dvdtitle;
			this.genre = genre;
			
			
		} // pb_DVD
				
		
	} // DVD
	
	class Book {
		int bookno;
		String booktitle;
		String genre;
		
		public Book() { }
		// 북넘버
		public Book ( int bookno ) {
			this.bookno = bookno;
		}
		
		// 북타이틀
		public Book ( String booktitle ) {
			this.booktitle = booktitle;
		}
		
		// 북넘버, 북타이틀
		public Book ( int bookno, String booktitle){
		//	this.bookno = bookno;
		//	this.booktitle = booktitle;
		// Book( bookno );				// 첫번째 줄 코드를 간단히 쓰면
		// Book( booktitle );				// 두번째 줄 코드를 간단히 쓰면
		this( bookno );					// 첫번째 줄 코드를 this()로 대체
		// this( booktitle );				// 두번째 줄 코드를 this()로 대체
		// 단, this()는 언제나 코드의 맨 처음에 나와야 함
		 
		} 
		
	} // Book
	